<?php
/**
 * класс обаспечивет подсчет просмотров и посетителей
 *
 */
class UniqueVisitor{
    /**
     * функция для записи уникальных просмотров и посетителей
     *
     * @param $server необходимо передать голбальный массив $_SERVER
     * @param $cookie необходимо передать голбальный массив $HTTP_COOKIE_VARS
     * @param $essenceType тип сущности
     * @param $idEssence id сущности
     */
    public static function uniqueVisit($server, $cookie, $essenceType, $idEssence) {
      $ip = $server['REMOTE_ADDR'];
      $browser = $server['HTTP_USER_AGENT'];
      $live = time() + 2592000;//устанавливаем время жизни кука и отностительно него записываем дату удаления
      $objSession = User_Session::instance();
      $idUser = $objSession->getUserId();
      if (!$idUser) {
	      if (empty($cookie['uniqueValue'])) {//если куков на компе нет
	        $uniqueValue = md5(time() + $ip);//задаем уникальное значение куку 'uniqueValue'
	        setcookie('uniqueValue', $uniqueValue, $live);//создаем кук
	        if (self::checkUserWithNoCookie($ip, $browser, $essenceType, $idEssence) == 0) {//проверяем не посещал ли пользователь сущности без куков, если не посещал
	          self::addVisitor($uniqueValue, $ip, $browser, $essenceType, $idEssence, $live);//записываем посещение
	          self::addBrawsing($essenceType, $idEssence);//записываем просмотр
	        }
	        else {//если пользователь посещал сущность и удалил куки
		        self::updateUniqueValue($ip, $browser, $essenceType, $idEssence, $uniqueValue);//то после создания новых нужно обновить uniqueValue в БД для того что бы в следующий раз проперять посещение по новым кукам
		      	self::incrementBrowsingTable($essenceType, $idEssence);//инкременируем просмотр
	        }
	      }
	      elseif (self::checkView($cookie['uniqueValue'], $essenceType, $idEssence) == 0) { //проверям, посещал ли пользователь эту сущность, если нет, то сохраняем
	          self::addVisitor($cookie['uniqueValue'], $ip, $browser, $essenceType, $idEssence, $live);//записываем посещение
	          self::addBrawsing($essenceType, $idEssence);//записываем просмотр
	      }
	      else
	      	self::incrementBrowsingTable($essenceType, $idEssence);//инкременируем просмотр
      }
      else {//если есть idUser     СЕЙЧАС ПРОВЕРКА ИДЕТ БЕЗ УЧАЕТА КУКИСОВ, IP И БРАУЗЕРА В БУДУЮЩЕМ МОЖНО ВСТАВИТЬ, НО БУДЕТ БОЛЬШАЯ НАГРУЗКА
      	if (empty($cookie['uniqueValue'])) {//если куков на компе нет
	        $uniqueValue = md5(time() + $ip);//задаем уникальное значение куку 'uniqueValue'
	        setcookie('uniqueValue', $uniqueValue, $live);//создаем кук
      	}
      	else
	      	$uniqueValue = $cookie['uniqueValue'];
    		if (self::checkUserById($essenceType, $idEssence, $idUser) == 0) {
	        self::addVisitor($uniqueValue, $ip, $browser, $essenceType, $idEssence, $live, $idUser);//записываем посещение
	        self::addBrawsing($essenceType, $idEssence);//записываем просмотр
    		}
    		else
	      	self::incrementBrowsingTable($essenceType, $idEssence);//инкременируем просмотр
      }
  	}

	/**
	 * добавляем просмотр
	 *
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
	 */
	public static function addBrawsing($essenceType, $idEssence) {
		self::incrementbrowsingAmount($essenceType, $idEssence);
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		$idUser == NULL ? "'NULL'" : $idUser;
		$stmt = "
		INSERT INTO `browsing` (`ID_user`,
														`ID_essence`,
														`essence_type`,
														`count`)
		VALUES (" . ($idUser == NULL ? "NULL" : $idUser) . ",
						" . $idEssence . ",
						" . $essenceType . ",
						1)";
		return $objDB->query($stmt);
	}

	/**
	 * инкременирует просмотренную сущность
	 *
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
	 */
	public static function incrementBrowsingTable($essenceType, $idEssence) {
		self::incrementbrowsingAmount($essenceType, $idEssence);
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `browsing`
		SET `count` = (`count` + 1)
		WHERE `browsing`.`ID_essence` = " . $idEssence . " AND `browsing`.`essence_type` = " . $essenceType;
		return $objDB->query($stmt);
	}

	/**
	 * плюсуем просмотр сущности
	 *
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
	 */
	public static function incrementbrowsingAmount($essenceType, $idEssence) {
		$objDB = Service_Database::instance();
		$essenceName = Service_Essence::getEssenceTypeName($essenceType);
		$stmt = "
		UPDATE `" . $essenceName . "`
		SET `browsing_amount` = (`browsing_amount` + 1)
		WHERE `ID_" . $essenceName . "` = " . $idEssence;
		return $objDB->query($stmt);
	}


  /**
   * функция обновления uniqueValue после создания новых куков
   *
   * @param $ip - ip
   * @param $browser - браузер
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
   * @param $uniqueValue - уникальное значение
   */
  public static function updateUniqueValue($ip, $browser, $essenceType, $idEssence, $uniqueValue) {
  	$objDB = Service_Database::instance();
  	$stmt = "
  	UPDATE `unique_visitor` SET `uniqueValue` = '" . $uniqueValue . "'
  	WHERE `unique_visitor`.`ip` = '" . $ip . "' AND
				`unique_visitor`.`browser` = '" . $browser . "' AND
				`unique_visitor`.`essence_type` = " . $essenceType . " AND
				`unique_visitor`.`ID_essence` = " . $idEssence;
  	return $objDB->query($stmt);
  }

	/**
	 * плюсуем посетителей сущности
	 *
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
	 */
	public static function incrementForVisitors($essenceType, $idEssence) {
		$objDB = Service_Database::instance();
		$essenceName = Service_Essence::getEssenceTypeName($essenceType);
		$stmt = "
		UPDATE `" . $essenceName . "`
		SET `visitors` = (`visitors` + 1)
		WHERE `ID_" . $essenceName . "` = " . $idEssence;
		return $objDB->query($stmt);
	}

  /**
   * проверяем посещение сущности по idUser
   *
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
   * @param $idUser - id пользователя
   */
  public static function checkUserById($essenceType, $idEssence, $idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT COUNT(`unique_visitor`.`uniqueValue`)
		FROM `unique_visitor`
		WHERE `unique_visitor`.`ID_user` = '" . $idUser . "' AND
					`unique_visitor`.`essence_type` = " . $essenceType . " AND
					`unique_visitor`.`ID_essence` = " . $idEssence . "
		LIMIT 1";
		return $objDB->selectSimpleField($stmt);
  }

	/**
	 * проверяем уникальности пользователя без куков по соответствию браузера и ip адреса
	 *
   * @param $ip - ip
   * @param $browser - браузер
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
	 */
	public static function checkUserWithNoCookie($ip, $browser, $essenceType, $idEssence) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT COUNT(`unique_visitor`.`uniqueValue`)
		FROM `unique_visitor`
		WHERE `unique_visitor`.`ip` = '" . $ip . "' AND
					`unique_visitor`.`browser` = '" . $browser . "' AND
					`unique_visitor`.`essence_type` = " . $essenceType . " AND
					`unique_visitor`.`ID_essence` = " . $idEssence . "
		LIMIT 1";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * вставляем в БД посетителя сущности
	 *
	 * @param $uniqueValue - уникальное значение
   * @param $ip - ip
   * @param $browser - браузер
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
	 * @param $live - вреям удаления
   * @param $idUser - id пользователя
	 */
	public static function addVisitor($uniqueValue, $ip, $browser, $essenceType, $idEssence, $live, $idUser = NULL) {
		$objDB = Service_Database::instance();
		self::incrementForVisitors($essenceType, $idEssence);
		$stmt = "
		INSERT INTO `unique_visitor` (`uniqueValue`,
																	`ip`,
																	`browser`,
																	`essence_type`,
																	`ID_essence`,
																	`deleteTime`,
																	`ID_user`)
		VALUES ('" . $uniqueValue . "',
						'" . $ip . "',
						'" . $browser . "',
						" . $essenceType . ",
						" . $idEssence . ",
						'" . gmdate("Y-m-d H:i:s", $live) . "',
						" . ($idUser == NULL ? "NULL" : $idUser) . ")";
		$objDB->query($stmt);
	}

	/**
	 * проверяем, посещал ли пользователь сущность
	 *
	 * @param $uniqueValue - уникальное значение
   * @param $essenceType - тип сущности
   * @param $idEssence - id сущности
	 */
	public static function checkView($uniqueValue, $essenceType, $idEssence) {
		$objDB = Service_Database::instance();
		$stmt="
		SELECT COUNT(`unique_visitor`.`uniqueValue`)
		FROM `unique_visitor`
		WHERE `unique_visitor`.`uniqueValue` = '" . $uniqueValue . "' AND
					`unique_visitor`.`essence_type` = " . $essenceType . " AND
					`unique_visitor`.`ID_essence` = " . $idEssence . "
		LIMIT 1";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * удаление устаревших записей посетителей
	 */
	public static function deleteOldRecord() {
		$objDB = Service_Database::instance();
		$stmt = "
		DELETE FROM `unique_visitor`
		WHERE `unique_visitor`.`deleteTime` <= '" . date("Y-m-d H:i:s") . "'";
		return $objDB->query($stmt);
	}
}
?>